package com.example.d2_regex;

/**
 * 目标：掌握正则表达式的书写规则
 */
public class RegexTest2 {
    public static void main(String[] args) {
        // 1.字符类(只能匹配单个字符)
        // 注意：以下带 [内容] 的规则都只能用于匹配单个字符
        System.out.println("a".matches("[abc]")); // true [abc]只能匹配a,b,c
        System.out.println("e".matches("[abcd]")); // false

        System.out.println("d".matches("[^abc]")); // true [^abc] 不能是a,b,c
        System.out.println("a".matches("[^abc]")); // false

        System.out.println("b".matches("[a-zA-Z]")); // true [a-zA-Z] 只能是a-z或者是A-Z的字符
        System.out.println("2".matches("[a-zA-Z]")); // false

        System.out.println("k".matches("[a-z&&[^bc]]")); // true a到z,但是不能是b和c
        System.out.println("b".matches("[a-z&&[^bc]]")); // false

        System.out.println("ab".matches("[a-zA-Z0-9]")); // false 表示只能是a-z 或者0-9或者是 A-Z

        System.out.println("---------------------------------------------------------------------------");

        // 2.预定义字符(只能匹配单个字符) \d  \D   \s  \S  \w  \W   一般大写的表示取反
        System.out.println("徐".matches(".")); // .可以匹配任意字符
        System.out.println("徐徐".matches(".")); // false

        // Java中,\是有特殊用途的,所以要\\转义
        System.out.println("3".matches("\\d")); // true \\d:表示0-9之间的一个数字
        System.out.println("12".matches("\\d")); // false 只能匹配单个字符

        System.out.println(" ".matches("\\s"));// true \s: 代表一个空白字符
        System.out.println("a".matches("\\s")); // false

        System.out.println("a".matches("\\S")); // false \S: 代表一个非空白字符
        System.out.println(" ".matches("\\S")); // true

        System.out.println("a".matches("\\w")); // true \\w: 表示[a-z 或者 A-Z 或者 _ 或者 0-9] 其中一个
        System.out.println("_".matches("\\w")); // true
        System.out.println("徐".matches("\\w")); // false

        System.out.println("徐".matches("\\W"));// true [^\w]不能是a-zA-Z_0-9
        System.out.println("a".matches("\\W"));// false

        System.out.println("23232".matches("\\d")); // false 注意：以上预定义字符都只能匹配单个字符

        System.out.println("---------------------------------------------------------------------------");

        // 3.数量词： ?   *   +   {n}   {n, }  {n, m}
        // \\w?: 表示[a-z 或者 A-Z 或者 _ 或者 0-9] 当中的字符要出现0次或1次
        System.out.println("a".matches("\\w?")); // ? 代表0次或1次
        System.out.println("".matches("\\w?")); // true
        System.out.println("abc".matches("\\w?")); // false

        System.out.println("abc12".matches("\\w*")); // * 代表0次或多次
        System.out.println("".matches("\\w*")); // true
        System.out.println("abc12张".matches("\\w*")); // false 不能有中文

        System.out.println("abc12".matches("\\w+")); // + 代表1次或多次
        System.out.println("".matches("\\w+")); // false
        System.out.println("abc12张".matches("\\w+")); // false

        System.out.println("a3c".matches("\\w{3}")); // {3} 代表要正好是n次
        System.out.println("abcd".matches("\\w{3}")); // false
        System.out.println("abcd".matches("\\w{3,}")); // {3,} 代表是>=3次
        System.out.println("ab".matches("\\w{3,}")); // false
        System.out.println("abcde徐".matches("\\w{3,}")); // false
        System.out.println("abc232d".matches("\\w{3,9}")); // {3, 9} 代表是  大于等于3次,小于等于9次

        System.out.println("---------------------------------------------------------------------------");

        // 4.其他几个常用的符号：(?i)忽略大小写 . 或：| .  分组：()
        System.out.println("abc".matches("(?i)abc")); // true
        System.out.println("ABC".matches("(?i)abc")); // true
        System.out.println("aBc".matches("a((?i)b)c")); // true
        System.out.println("ABc".matches("a((?i)b)c")); // false

        // 需求1：要求要么是3个小写字母,要么是3个数字  |表示或
        System.out.println("abc".matches("[a-z]{3}|\\d{3}")); // true
        System.out.println("ABC".matches("[a-z]{3}|\\d{3}")); // false
        System.out.println("123".matches("[a-z]{3}|\\d{3}")); // true
        System.out.println("A12".matches("[a-z]{3}|\\d{3}")); // false

        // 需求2：必须是”我爱“开头,中间可以是至少一个”编程“,最后至少是1个”666“
        System.out.println("我爱编程编程666666".matches("我爱(编程)+(666)+")); // true
        System.out.println("我爱编程编程66666".matches("我爱(编程)+(666)+")); // false
    }
}
